from flask import Flask, request, jsonify
from flask_cors import CORS
from openai import OpenAI
import json

app = Flask(__name__)
CORS(app)

@app.route('/chat', methods=['POST'])
def chat():
    if not request.is_json:
        return jsonify({
            'code': 400,
            'message': '请求必须是JSON格式'
        }), 400
    
    msg = request.json.get('msg')
    print(msg)
    # 参数验证
    if not msg:
        return jsonify({
            'code': 400,
            'message': '参数msg不能为空'
        }), 400
    
    if len(msg) <= 2:
        return jsonify({
            'code': 400,
            'message': '参数msg长度必须大于2个字符'
        }), 400
    
    try:
        client = OpenAI(
            base_url="https://ai.gitee.com/v1",
            api_key="WN35FCLWFTIR81OBWDFNGHXXH2MDKXAU3DM7QS1W",
            default_headers={"X-Failover-Enabled":"true"}
        )

        response = client.chat.completions.create(
            model="InternLM3-8B-Instruct",
            stream=True,
            max_tokens=1024,
            temperature=0.6,
            top_p=0.7,
            extra_body={
                "top_k": 50,
            },
            frequency_penalty=0,
            messages=[
                {
                    "role": "system",
                    "content": """
                    你是一位历史学家，学生选择历史事件，应用提供该历史事件的背景资料、角色介绍和剧情框架。
                    学生在角色扮演过程中，可通过与AI控制的虚拟角色互动，推进剧情发展。
                    AI虚拟角色会根据历史事实和剧情逻辑做出相应回应，帮助学生加深对历史事件的理解与记忆。
                    为帮助学生更好地理解历史事件，你需要扮演一个历史学家的角色，根据学生提供的历史事件，为其提供详细的背景资料、角色介绍和剧情框架。
                    如果遇到生僻字，你需要使用拼音或注释来解释这些生僻字。
                    1、给出历史事件的背景资料、角色介绍和剧情框架;
                    2、背景资料、角色介绍和剧情框架需要详细，字数不少于100字;
                    3、背景资料、角色介绍和剧情框架需要以json格式返回;
                    4、背景资料、角色介绍和剧情框架需要包含以下内容：
                        4.1、历史事件的背景资料;
                        4.2、角色介绍;
                        4.3、剧情框架;
                        4.4、角色介绍需要包含以下内容：
                            4.4.1、角色名称;
                            4.4.2、角色性别;
                            4.4.3、角色年龄;
                            4.4.4、角色职业;
                            4.4.5、角色背景;
                            4.4.6、角色特点;
                            4.4.7、角色技能;
                    5、剧情框架需要包含以下内容：
                        5.1、剧情框架;
                        5.2、剧情框架需要详细，字数不少于200字;
                    5、返回的信息格式为json;
                    6、json格式为(其中history为剧情框架)：
                        {
                            "history":"xxx",
                            "data":
                                [{
                                    "name":"xxx",
                                    "sex":"xxx",
                                    "job":"xxx",
                                    "age":"xxx",
                                    "background":"xxx",
                                    "features":"xxx",
                                    "skills":"xxx"
                                }]
                        }
                    7、不要返回多余的内容，如果json格式不正确则重新生成。
                    此次需要沟通的历史问题是："""+msg
                }
            ],
        )

        result = ""
        for chunk in response:
            if chunk.choices[0].delta.content is not None:
                result += chunk.choices[0].delta.content

        # 提取并处理JSON数据
        start_index = result.find('{')
        end_index = result.rfind('}') + 1
        json_str = result[start_index:end_index]
        
        # 尝试解析JSON，如果失败则进行清理
        try:
            json_data = json.loads(json_str)
            # 确保data字段是一个数组
            if 'data' in json_data and not isinstance(json_data['data'], list):
                json_data['data'] = [json_data['data']]
        except json.JSONDecodeError:
            # 清理可能的格式问题
            json_str = json_str.strip()
            json_str = json_str.replace('```json', '').replace('```', '')
            json_str = json_str.replace('\"', '"')
            
            # 尝试再次解析
            try:
                json_data = json.loads(json_str)
                # 确保data字段是一个数组
                if 'data' in json_data and not isinstance(json_data['data'], list):
                    json_data['data'] = [json_data['data']]
            except json.JSONDecodeError as e:
                raise Exception(f'JSON格式错误: {str(e)}，原始数据: {json_str}')
        print("下面是获取到的数据：", json_data)
        response_data = {
            'code': 200,
            'data': {
                'history': json_data.get('history', ''),
                'data': json_data.get('data', [])
            }
        }
        print("Response data:", response_data)
        return jsonify(response_data)

    except Exception as e:
        return jsonify({
            'code': 500,
            'message': f'服务器内部错误: {str(e)}'
        }), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)